// Package main 演示GORM的多对多关联关系操作（自定义中间表版本）
// 本示例详细展示了如何在GORM中使用自定义中间表实现多对多关联关系
// 具体演示了User1Model（用户）和Article1Model（文章）之间通过自定义中间表User2ArticleModel实现的多对多关联操作
// 自定义中间表允许在关联关系中存储额外的元数据字段
package main

import (
	"fmt"            // 用于打印输出结果和调试信息
	"gin-gorm/global" // 全局数据库连接配置，提供数据库连接和迁移功能
	"gin-gorm/models" // 数据模型定义，包含User1Model、Article1Model和User2ArticleModel
	"time"           // 用于处理时间类型数据
)

// UserToMany 演示使用自定义中间表的多对多关联操作
// 该函数包含多个操作示例，部分示例被注释掉
func UserToMany() {
	// 示例1: 创建用户，连带创建或关联文章
	// SetupJoinTable用于显式配置多对多关联的中间表
	// global.DB.SetupJoinTable(&models.User1Model{}, "Col1ArticleList", &models.User2ArticleModel{})
	// err := global.DB.Create(&models.User1Model{
	// 	Name: "test", // 设置用户名称
	// 	Col1ArticleList: []models.Article1Model{ // 设置用户关联的文章列表
	// 		{ID: 1}, // 关联已有文章（通过ID）
	// 		{ID: 2}, // 关联已有文章（通过ID）
	// 		// {Title: "Go零基础"}, // 创建并关联新文章
	// 		// {Title: "Python零基础"}, // 创建并关联新文章
	// 	},
	// }).Error // 创建用户及关联关系
	// fmt.Println(err) // 打印可能的错误信息

	// 示例2: 删除用户及其关联关系
	// var user UserModel
	// global.DB.Take(&user) // 获取一个用户
	// global.DB.Select("CollArticleList").Delete(&user) // 删除用户并级联删除其关联的文章

	// 示例3: 查询某个用户收藏的文章列表（通过主模型预加载关联）
	//var user = models.User1Model{ID: 4} // 创建用户模型并设置ID
	//global.DB.Preload("CollArticleList").Take(&user) // 预加载用户的文章列表
	//fmt.Println(user, user.CollArticleList) // 打印用户信息和关联的文章列表

	// 定义响应结构体，用于整合用户和文章的关联信息
	// 该结构体用于展示如何将多表关联数据转换为前端友好的响应格式
	type UserCollArticleResponse struct {
		Name         string    // 用户名
		UserID       int64     // 用户ID
		ArticleTitle string    // 文章标题
		ArticleID    int64     // 文章ID
		Date         time.Time // 关联创建时间
	}
	var collList []UserCollArticleResponse // 存储转换后的响应数据

	// 示例4: 通过中间表查询用户与文章的关联信息（推荐方式）
	var userID = 1 // 要查询的用户ID
	var userArticleList []models.User2ArticleModel // 存储中间表记录
	// Preload("UserModel"): 预加载关联的用户信息
	// Preload("ArticleModel"): 预加载关联的文章信息
	// Find(&userArticleList, "user_id = ?", userID): 根据user_id条件查询中间表记录
	global.DB.Preload("UserModel").Preload("ArticleModel").Find(&userArticleList, "user_id = ?", userID)
	fmt.Println(userArticleList) // 打印原始中间表数据（包含关联的用户和文章信息）

	// 将中间表数据转换为自定义的响应格式
	for _, model := range userArticleList {
		collList = append(collList, UserCollArticleResponse{
			Name:         model.UserModel.Name,         // 从关联的用户模型中获取用户名
			UserID:       model.UserID,                 // 从中间表获取用户ID
			ArticleTitle: model.ArticleModel.Title,     // 从关联的文章模型中获取文章标题
			ArticleID:    model.ArticleID,              // 从中间表获取文章ID
			Date:         model.CreatedAt,              // 从中间表获取关联创建时间
		})
	}
	fmt.Println(collList) // 打印转换后的响应数据

	// 示例5: 清空用户与文章的所有关联关系
	var user = models.User1Model{ID: 3} // 创建用户模型并设置ID
	global.DB.Take(&user) // 获取该用户
	// Model(&user).Association("CollArticleList").Clear(): 清空用户的CollArticleList关联
	// 这只会删除中间表中的关联记录，不会删除用户或文章本身
	global.DB.Model(&user).Association("CollArticleList").Clear()
}

// main 程序入口函数
// 负责初始化数据库连接并执行多对多关联操作的示例
func main() {
	// 1. 连接数据库
	// global.Connect(): 调用全局配置中的数据库连接函数，建立与数据库的连接
	// 该函数通常会初始化GORM实例并配置连接池等参数
	global.Connect()
	
	// 2. 可选：执行数据库迁移（当前被注释掉）
	// global.Migrate(): 自动迁移数据库架构，根据模型定义创建或更新数据库表
	// 注释掉表示使用已存在的数据库架构，不执行自动迁移
	// global.Migrate()
	
	// 3. 执行多对多关联操作示例
	// UserToMany(): 调用前面定义的函数，执行各种多对多关联操作
	// 包括创建关联、查询关联和删除关联等示例
	UserToMany()
}
